home *** CD-ROM | disk | FTP | other *** search
/ Aminet 19 / Aminet 19 (1997)(GTI - Schatztruhe)[!][Jun 1997].iso / Aminet / util / cli / Randomizer.lha / Randomizer.c < prev    next >
C/C++ Source or Header  |  1997-04-05  |  3KB  |  133 lines

  1. /*
  2.  * Random Numbers
  3.  * For use with any ANSI C-Compiler
  4.  * Tested with Maxon C/C++ 4.0
  5.  */
  6.  
  7. #include <pragma/exec_lib.h>
  8. #include <pragma/dos_lib.h>
  9. #include <pragma/intuition_lib.h>
  10.  
  11. #include <clib/macros.h>
  12.  
  13. #include <stdlib.h>
  14.  
  15.  
  16. struct Library *IntuitionBase = NULL;
  17. LONG args[2] = {0, 0};
  18. STRPTR tmplate = "HI=HIGH/K/N,LO=LOW/K/N\n";
  19.  
  20.  
  21. LONG int2asc(char *c, LONG n, LONG b);
  22.  
  23. // retval = int2asc(targetstring, number to convert, numbers base);
  24.  
  25. // retval:          Numbers base for success, 0 if base not supported
  26. // targetstring:    String with enough space to hold the ascii-ized number
  27. // num. to convert: POSITIVE number only, if negative will be switched to positive !!!
  28. // numbers base:    Base to which the number will be converted, currently only
  29. //                  binary (2), octal (8) and decimal (10) support
  30.  
  31.  
  32. void main(void)
  33. {
  34.    struct RDArgs *rdargs;
  35.    ULONG secs, mics;
  36.    LONG low = 0, high = 1, random, *num;
  37.    int rw = RETURN_FAIL;
  38.    char numbuf[8];
  39.  
  40.    IntuitionBase = OpenLibrary("intuition.library", 37);
  41.    if(IntuitionBase)
  42.    {
  43.       rw = RETURN_ERROR;
  44.  
  45.       rdargs = ReadArgs(tmplate, args, NULL);
  46.       if(rdargs)
  47.       {
  48.          rw = RETURN_OK;
  49.  
  50.          num = (LONG *) args[0];
  51.          if(num)
  52.          {
  53.             high = *num;
  54.          }
  55.  
  56.          num = (LONG *) args[1];
  57.          if(num)
  58.          {
  59.             low = *num;
  60.          }
  61.  
  62.          FreeArgs(rdargs);
  63.       }
  64.  
  65.       CurrentTime(&secs, &mics); // Intuition interface to timer/GetSysTime
  66.  
  67.       secs %= (high + 1);        // Mask out anything above "high"
  68.       random = MAX(secs, low);   // Make sure, value is at least "low"
  69.  
  70.       // No need to test the return value for base 10 here
  71.       int2asc(numbuf, random, 10);
  72.  
  73.       // Create a dos shell variable named RANDOM
  74.       if(SetVar("RANDOM", numbuf, -1, LV_VAR) == DOSFALSE)
  75.       {
  76.          rw = RETURN_ERROR;
  77.       }
  78.  
  79.       CloseLibrary(IntuitionBase);
  80.    }
  81.  
  82.    exit(rw);
  83. }
  84.  
  85. // Here is the interesting part
  86.  
  87. LONG int2asc(char *c, LONG n, LONG b)
  88. {
  89.    char zahl[32]; // Widest range is binary: uses 32 chars, one for each bit
  90.    LONG tmp, rw, i = 0;
  91.  
  92.    n = ABS(n);  // Get rid of a possibly signed value
  93.  
  94.    switch(b)
  95.    {
  96.       case 16:
  97.          rw = 0;  // Not yet supported, but easy to implement. I don't need it here.
  98.       break;
  99.  
  100.       case 10: // Anything equal to or below base 10 has the same handling
  101.       case 8:
  102.       case 2:
  103.          // Generate ascii-ized string, is written REVERSED into the buffer !!!
  104.          do
  105.          {
  106.             tmp = (n % b);
  107.             tmp += 48;  // Promote the remainder to it's ascii equivalent
  108.             zahl[i] = tmp;
  109.             i++;
  110.             n /= b;
  111.          }
  112.          while(n);
  113.  
  114.          c[i] = 0;      // Set the terminating null-byte
  115.          i--;           // Adjust the counter
  116.          while(i >= 0)  // Reverse copy the number to the string
  117.          {
  118.             *c = zahl[i];
  119.             c++;
  120.             i--;
  121.          }
  122.  
  123.          rw = b;  // return "ok"
  124.       break;
  125.  
  126.       default:
  127.          rw = 0;  // return "not yet implemented"
  128.       break;
  129.    }
  130.  
  131.    return(rw);
  132. }
  133.